2.06. Планирование задач
Планирование задач
Представьте, что у вас есть исполняемый файл (скрипт), который каждый день в 8 утра пользователь или администратор запускает вручную - например, для резервного копирования важных файлов или запуска какой-то системы. Каждый раз открывается ярлык на рабочем столе, кликаем по нему и ждём завершения. Это работает, но неэффективно. А если забыть, или не будет возможности нажать? А если таких задач десятки?
Именно для этого и существует планирование задач - автоматическое выполнение программ, скриптов или команд в заданное время или при наступлении определённых условий. Это позволяет:
- освободить пользователя от рутинных действий;
- гарантировать регулярность выполнения (например, резервное копирование каждую ночь);
- оптимизировать использование ресурсов (запускать тяжёлые задачи ночью, когда система простаивает);
- обеспечить надёжность и предсказуемость поведения системы.
Так зачем запускать вручную, если можно автоматизировать?
Автоматический запуск - это выполнение программы без прямого участия пользователя. Например, антивирус сам обновляется, а веб-сервер стартует при включении компьютера.
Планирование задач - это процесс настройки автоматического запуска задач в определённое время или по определённому расписанию.
Планировщик задач - это компонент операционной системы, отвечающий за хранение, управление и выполнение запланированных задач. Он следит за временем, условиями и запускает нужные программы.
Расписание задачи - набор правил, определяющих, когда и при каких условиях задача должна быть выполнена (например «каждый день в 2:00», «при запуске системы», «каждые 10 минут»).
Очередь планировщика задач - внутренняя структура, в которой хранятся запланированные задачи в порядке их приоритета или времени выполнения. Планировщик просматривает очередь и запускает задачи по мере наступления их времени.
Планировщик задач - это фоновый процесс (демон в Linux, служба в Windows), которой работает постоянно и следит за временем и событиями. Вот как это происходит в общих чертах:
- Регистрация задачи. Пользователь или системный администратор добавляет задачу в планировщик, указывая:
- что запускать (путь к скрипту, программе, исполняемому файлу);
- когда запускать (время, дата, периодичнось);
- при каких условиях (при запуске системы, при простое, с правами администратора и т.д.).
- Хранение расписания. Планировщик сохраняет эту информацию в специальной базе данных или конфигурационном файле.
- Мониторинг времени. Планировщик периодически проверяет системное время и сравнивает его с расписаниями задач.
- Запуск задачи. Когда наступает нужное время (или выполняется условие), планировщик запускает указанную программу с заданными параметрами.
- Логирование. Многие планировщики ведут журнал выполнения - чтобы можно было проверить, успешно ли выполнилась задача, в какое время, были ли ошибки.
Примеры - в Windows используется планировщик заданий (Task Scheduler), в Linux - cron и system timers. Несмотря на различия в реализации, оба подхода решают одну и ту же задачу: автоматизировать выполнение команд по расписанию.
Возможно, вы сталкивались с автозапуском в Windows. Автозапуск - это не планировщик, а частный случай автоматического запуска, который не всегда подчиняется расписанию. Он происходит при других случаях:
- при входе пользователя в систему (через папку Автозагрузка);
- при запуске самой ОС (через службы или реестр);
- при подключении устройства.
Ключевое отличие от планировщика задач в том, что автозапуск не позволяет гибко настраивать время (например, каждый понедельник в 7:30), не поддерживает сложные условия, и не ведёт детального лога выполнения.
Планировщик же включает в себя функции автозапуска, но даёт гораздо больше контроля. Например, вы можете настроить задачу «запускать скрипт при входе пользователя в систему», но при этом добавить условия: только если сеть активна, и только если система не на батарейке.
CRON - это утилита в UNIX-подобных системах (Linux, macOS), предназначенная для планирования выполнения команд по расписанию. Название происходит от греческого слова chronos (время). Есть популярный миф, что CRON это аббревиатура Command On Run - но это не так. 😉
CRON работает как фоновый демон (crond), который постоянно запущен и каждую минуту проверяет конфигурационные файлы, чтобы понять, какие задачи нужно выполнить. Каждый пользователь может иметь свой crontab-файл, специальный файл с расписанием задач. Системные задачи могут быть определены в /etc/crontab или в папке /etc/cron.d/
CRON нужен для автоматического резервного копирования, очистки временных файлов, обновления программ, отправки отчетов по почте, мониторинга системы.
Управляется он при помощи CRON-выражений. Это строка из пяти полей, определяющих, когда должна выполняться команда. Пишутся они подряд, и приблизительно структура такова:
1 2 3 4 5 команда
| Номер | Поле | Допустимые значения | Пример |
|---|---|---|---|
| 1 | Минуты | 0–59 | 0, 30, */15 (каждые 15 минут) |
| 2 | Часы | 0–23 | 2, 14, */6 (каждые 6 часов) |
| 3 | День месяца | 1–31 | 1, 15, * (каждый день) |
| 4 | Месяц | 1–12 | 1 (январь), 6, * |
| 5 | День недели | 0–7 | 0 или 7 (воскресенье), 1 (понедельник), * (все дни) |
Важно: день недели и день месяца связаны логическим ИЛИ, если указаны оба — задача выполнится, если совпадает хотя бы одно условие. Но обычно используют только один из них.
Специальные символы:
-
- — любое значение («каждый»).
- , — список значений (например, 1,3,5).
-
- — диапазон (например, 9-17 — с 9 до 17).
- */n — каждые n единиц (например, */5 в минутах — каждые 5 минут).
Допустим, у нас есть скрипт для резервного копирования, который нужно запускать каждый день в 2:30 утра. Скрипт находится по пути: /home/user/scripts/backup.sh
Шаг 1: Открываем crontab для редактирования:
crontab -e
Шаг 2: Добавляем строку:
30 2 * * * /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1
Здесь мы указали:
- 30 — минута 30.
- 2 — час 2 (2:30 утра).
-
- — любой день месяца.
-
- — любой месяц.
-
- — любой день недели.
Команда: запуск скрипта.
>> /home/user/logs/backup.log — запись вывода в лог-файл.
2>&1 — перенаправление ошибок туда же.